#!/bin/bash

#funcion para logear
function log() {
        command=$1
        message=$2 
        type=$3
	if [ $# -ge 2 ] && [ $# -le 3 ] 
        then
			Logging.sh "$command" "$message" "$type" 
        fi
}

#Obtiene la palabra de mayor longitud de la línea
function getPalabraMasLarga()
{
	palabraMasLarga=""
	
	for palabra in "$@";
	do	
		if [ ${#palabra} -gt ${#palabraMasLarga} ];then  
			palabraMasLarga=$palabra
	 	fi
	done
	
}

function corroborarNumericoYCreciente()
{
	#@PARAM $1: archivo al que corroborarle su primera columna
	
	sonTodosNumerosYCrecientes=SI
	declare -i numero=0
	regexpnum='^[0-9]+$'
	
	while read presuntoNumero
	do
	  if ! [[ $presuntoNumero =~ $regexpnum ]] ; then
	    sonTodosNumerosYCrecientes=NO
	    break
	  else
	    if [ $presuntoNumero -lt $numero ] ; then
	      sonTodosNumerosYCrecientes=NO
	      break
	    else
	      numero=$presuntoNumero
	    fi
	    
	  fi
	
	done< <(cat $ACEPDIR/$archivo | cut -d ";" -f1)
		
}

function procesarArchivo()
{
	#@PARAM $1: lista de compra (corroborada) a procesar"
	#Voy procesando línea por línea de la lista de compras.
	while read linea
	do	
		huboCoincidencia=NO
		#Por cada línea:
			#-Tomo la descripción del producto.
			#-Le quito los espacios adicionales que tenga entre palabras.
			#-Le quito la unidad (no me importa por ahora).
			#-Le quito el espacio que quedó después de sacarle la unidad.
			#-Ordeno las palabras del string, alfnuméricacamente.
			#-Paso a minúsculas.
		lineaFormateada=`echo $linea | cut -d ";" -f2 | sed 's/  */\ /g' | awk '{$(NF)=""}1' | sed   's/[ \t]*$//' | xargs -n1 | sort -u | xargs | tr '[:upper:]' '[:lower:]' | sed 's/á/a/g' | sed 's/é/e/g' | sed 's/í/i/g' | sed 's/ó/o/g' | sed 's/ú/u/g'`
				
		#Proceso de manera de quedarme con una expresión regular del tipo ".*\<palabra1\>.*\<palabra2\>.*\<...palabraN\>.*"
		cualquierPalabra="\\\>.*\\\<"
		expreg=`echo $lineaFormateada | sed 's/ /'$cualquierPalabra'/g'`
		expreg=".*\<"$expreg"\>.*"
		#echo "Soy la expresión regular resultante: $expreg"
		
		#Tomo la palabra más larga de de la línea a buscar (por ser la más improbable) e itero sólo sobre las líneas de la lista maestra que contengan a esa palabra.
		getPalabraMasLarga `echo $linea | cut -d ";" -f2`
		
		while read lineaMaestroDePrecios
		#grep $palabraMasLarga $MAEDIR/precios.mae | while read lineaMaestroDePrecios;
		
		do
		
			#Normalizo la línea de la lista maestra.
			lineaMaestroDePreciosFormateada=`echo $lineaMaestroDePrecios | cut -d ";" -f4 | sed 's/  */\ /g' | awk '{$(NF)=""}1' | sed   's/[ \t]*$//' | xargs -n1 | sort -u | xargs | tr '[:upper:]' '[:lower:]' | sed 's/á/a/g' | sed 's/é/e/g' | sed 's/í/i/g' | sed 's/ó/o/g' | sed 's/ú/u/g'`
			#echo "Comparando la línea del maestro de precios $lineaMaestroDePreciosFormateada contra la expreg $expreg"  
 			if [[ $lineaMaestroDePreciosFormateada =~ $expreg ]];then
			# Si hay coincidencia en la expresión regular, me fijo si la hay también en las unidades.      
			  	unidadLinea=`echo $linea | awk '{print $(NF)}' | tr '[:upper:]' '[:lower:]'`
				unidadLineaMaestroDePrecios=`echo $lineaMaestroDePrecios | cut -d ";" -f4 | awk '{print $(NF)}' | tr '[:upper:]' '[:lower:]'`

				#Me fijo si las dos unidades son equivalentes.
				old_IFS=$IFS
				IFS=';'
				
				#echo "La unidad que voy a buscar es: $unidadLinea"
				#echo "La unidad de la línea maestra de precios es: $unidadLineaMaestroDePrecios"
				
				#Remuevo los ';' residuales.
				for unidad in `grep -w $unidadLinea $MAEDIR/um.tab | sed 's/;\+$//'`
				do
					
					if [ $unidadLineaMaestroDePrecios = $unidad ]; then
				
						#Si hay coincidencia, grabar:
						#	-NRO. ITEM
						#	-PRODUCTO PEDIDO
						#	-SUPER_ID
						#	-PRODUCTO ENCONTRADO
						#	-PRECIO
						#En $INFODIR/pres/usuario.xxx
						IFS=$old_IFS
						nroItemAGrabar=`echo $linea | cut -d ";" -f1`
						productoPedidoAGrabar=`echo $linea | cut -d ";" -f2`
						superIDAGrabar=`echo $lineaMaestroDePrecios | cut -d ";" -f1`
						productoEncontradoAGrabar=`echo $lineaMaestroDePrecios | cut -d ";" -f4`
						precioAGrabar=`echo $lineaMaestroDePrecios | cut -d ";" -f5`
					
					echo "$nroItemAGrabar;$productoPedidoAGrabar;$superIDAGrabar;$productoEncontradoAGrabar;$precioAGrabar">>"$INFODIR/pres/$archivo"	
					huboCoincidencia=SI
					
					break
					fi
					
				done
				
				IFS=$old_IFS
                                        
                       	fi
                     

		#done
		done < <(grep -i $palabraMasLarga $MAEDIR/precios.mae)
		
		#Si no hay coincidencia, grabar:
                #       -NRO. ITEM
                #       -PRODUCTO PEDIDO
                #       -El resto de los datos vacíos 
         
		if ! [ $huboCoincidencia = SI ]; then

			nroItemAGrabar=`echo $linea | cut -d ";" -f1`
                	productoPedidoAGrabar=`echo $linea | cut -d ";" -f2`

                	echo "$nroItemAGrabar;$productoPedidoAGrabar;;;">>"$INFODIR/pres/$archivo"
		fi

	done <"$ACEPDIR/$archivo"
	#done < <(ls -F $ACEPDIR | grep -v \/ | egrep "[^~]$" | grep "$archivo")
	
	#@LOG.
	lineaLog="Archivo $archivo procesado. Se creó $INFODIR/pres/$archivo"$'\n--------------------------------------------'
	log "Rating.sh" "$lineaLog" "I"
}

function rating()
{
	#Inhibo los mensajes de archivo no encontrado.
	#stty -echo
	
	#@TODO: sacar de las variables de entorno de un archivo de configuración.
	#declare local directorio
	#ACEPDIR=ACEPDIR
	PROC=proc
	#RECHDIR=RECHDIR
	#MAEDIR=MAEDIR
	#INFODIR=INFODIR
	
	IFS=$' \t\n'
	IFS_INICIAL=$IFS
	
	#@LOG.
	lineaLog=$'Inicio de Rating.\nCantidad de Listas de Compras a procesar: '`ls -F $ACEPDIR | grep -v \/ | egrep "[^~]$" | wc -l`''$'\n--------------------------------------------'
	log "Rating.sh" "$lineaLog" "I"

	#Proceso o rechazo los archivos hasta que el directorio quede vacío. Excluyo directorios y archivos temporales.
	
	#@TODO corroborar que los archivos de ACEPDIR ya vienen sin espacios.
	#old_IFS=$IFS
	IFS=$'\n'
	
	#for archivo in `ls -F $ACEPDIR | grep -v \/ | egrep "[^~]$"` 
	while read archivo
	do
		#@LOG.
		lineaLog="Archivo a procesar: $archivo"
		log "Rating.sh" "$lineaLog" "I"
		
		#CORROBORACIÓN 1: Si el archivo actual, ya fue procesado, lo muevo a $RECHDIR.
		if [ -f $ACEPDIR/$PROC/$archivo ]; then
			
			#@LOG.
			lineaLog="LOG: Se rechaza el archivo $archivo por estar DUPLICADO. Moviendo a RECHDIR."
			log "Rating.sh" "$lineaLog" "W"
			
			#@MOVER.
			#mv -f $ACEPDIR/$archivo $RECHDIR
			Mover.sh $ACEPDIR/$archivo $RECHDIR 
			
		else
			#CORROBORACIÓN 2: si no fue procesado, le quito todas las líneas en blanco.
			
			#@LOG.
			lineaLog="LOG: El $archivo nunca fue procesado. Comenzando parseo. Quitando líneas en blanco."
			log "Rating.sh" "$lineaLog" "I"
			
			sed '/^$/d' $ACEPDIR/$archivo > $ACEPDIR/$archivo.aux
			rm $ACEPDIR/$archivo
			
			#@MOVER
			#mv $ACEPDIR/$archivo.aux $ACEPDIR/$archivo
			Mover.sh $ACEPDIR/$archivo.aux $ACEPDIR/$archivo

			#CORROBORACIÓN 3: si después de la normalización, el archivo pesa 0 bytes, estaba vacío, y es rechazado.
			if ! [ -s $ACEPDIR/$archivo ]; then
				#@LOG.
				lineaLog="El $archivo está vacío. Moviendo a RECHDIR."
				log "Rating.sh" "$lineaLog" "W"
				
				#@MOVER
				#mv -f $ACEPDIR/$archivo $RECHDIR
				Mover.sh $ACEPDIR/$archivo $RECHDIR
				continue
			else
				#@LOG.
				lineaLog="El $archivo no está vacío."
				log "Rating.sh" "$lineaLog" "I"
			fi
			
			#CORROBORACIÓN 4: el primer campo de las líneas debe ser numérico y creciente.
			corroborarNumericoYCreciente $archivo
			
			if ! [ $sonTodosNumerosYCrecientes = SI ]; then
			  #@LOG.
			  lineaLog="El $archivo no contiene su primer campo con ítems numéricos y crecientes. Moviendo a RECHDIR."
			  log "Rating.sh" "$lineaLog" "W"
			  sonTodosNumerosYCrecientes=SI
			  
			  #@MOVER
			  Mover.sh $ACEPDIR/$archivo $RECHDIR
			  continue
			fi
			
			
			#CORROBORACIÓN 4: los no procesados ni vacíos deben cumplir con el formato NROITEM;PRODUCTOPEDIDO
			regex='^[0-9]+;{1}.*'
			todasLineasValidas=SI

			while read linea
			do
				numeroDeColumnas=`echo $linea | awk 'BEGIN{FS=";"};{print NF}'`

				if [ $numeroDeColumnas -ne 2 ];then
					todasLineasValidas=NO
				else
					if ! [[ $linea =~ $regex ]];then
						todasLineasValidas=NO
					fi 	        
                             	fi
                                       
			done <$ACEPDIR/$archivo

			if [ $todasLineasValidas = SI ];then
				#@LOG.
				lineaLog="El $archivo tiene formato válido. Inicia el proceso de sus compras."
				log "Rating.sh" "$lineaLog" "I"
				
				IFS=$IFS_INICIAL
				procesarArchivo $archivo
				IFS=$'\n'
				
				#@MOVER
				#mv -f $ACEPDIR/$archivo $ACEPDIR/$PROC
				Mover.sh $ACEPDIR/$archivo $ACEPDIR/$PROC
			else
				#LOG.
				lineaLog="El $archivo tiene formato inválido. Moviendo a RECHDIR."
				log "Rating.sh" "$lineaLog" "W"
				
				#@MOVER
				#mv -f $ACEPDIR/$archivo $RECHDIR
				Mover.sh $ACEPDIR/$archivo $RECHDIR
			fi
		fi		
	done < <(ls -F $ACEPDIR | grep -v \/ | egrep "[^~]$")

	IFS=$IFS_INICIAL
	#stty echo
}

rating

#log "Commando" "MENSAJE" "I"
#log "INSTALLER" "MENSAJEINSTALLER" "W"